﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using DAL.Entities;
using BAL;

namespace GrouponDesktop.ComprarGiftCard
{
    public partial class GiftCardFrm : Form
    {
        private string _fechaActual;
        private GiftCardBAL _giftBAL;
        private ClienteBAL _clienteBAL;
        private DataTable _dt;
        private ClienteEntity _clienteOrigen;

        public GiftCardFrm(UsuarioEntity usuario)
        {
            InitializeComponent();
            this._giftBAL = new GiftCardBAL();
            this.CancelButton = this.btnCancelar;

            //Obtengo los datos del cliente que esta comprando la GiftCard
            this._clienteBAL = new ClienteBAL();
            this._clienteOrigen = this._clienteBAL.GetClienteByUserId(usuario.IntIdUsuario);

            //Seteo los controles que poseen datos del cliente y del sistema
            _fechaActual = ConfigurationSettings.AppSettings["actualDate"].ToString();
            this.lblFechaActual.Text = _fechaActual;
            this.lblUser.Text += usuario.VarUsername;

            this.CargarGrillaClientes();
            this.CargarComboMontos();
        }

        private void CargarGrillaClientes()
        {
            List<ClienteEntity> clientes = this._clienteBAL.GetClientes();

            //Saco al cliente que esta haciendo la compra
            //para que no se pueda regalar una gift a el mismo
            clientes.Remove(this._clienteOrigen);

            this._dt = this.CrearDataTableClientes(clientes);

            this.dgwClientes.DataSource = this._dt;
            this.ConfigurarDataGrid();
        }

        private DataTable CrearDataTableClientes(List<ClienteEntity> clientes)
        {
            DataTable dt = new DataTable();

            //Defino las columnas
            dt.Columns.Add("IdCliente", typeof(int));
            dt.Columns.Add("Nombre", typeof(string));
            dt.Columns.Add("Apellido", typeof(string));
            dt.Columns.Add("Mail", typeof(string));
            dt.Columns.Add("Usuario", typeof(string));

            //Seteo las filas
            foreach (ClienteEntity cliente in clientes)
            {
                //Agrego al cliente a la tabla solo si esta activo
                if (!cliente.BitIsDeleted)
                    dt.Rows.Add(cliente.IntIdCliente, cliente.VarNombre, cliente.VarApellido, cliente.VarMail, cliente.VarUsername);
            }

            return dt;
        }

        private void ConfigurarDataGrid()
        {
            this.dgwClientes.BorderStyle = BorderStyle.FixedSingle;
            this.dgwClientes.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;
            this.dgwClientes.RowHeadersVisible = false;
            this.dgwClientes.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            this.dgwClientes.MultiSelect = false;
            this.dgwClientes.RowTemplate.Resizable = DataGridViewTriState.False;
            this.dgwClientes.AllowUserToAddRows = false;

            for (int i = 0; i < this.dgwClientes.ColumnCount; i++)
            {
                this.dgwClientes.Columns[i].Width = 115;
                this.dgwClientes.Columns[i].Resizable = DataGridViewTriState.False;
                this.dgwClientes.Columns[i].ReadOnly = true;
            }

            this.dgwClientes.Columns["IdCliente"].Visible = false;
        }

        private void CargarComboMontos()
        {
            this.cmboMontos.DataSource = this._giftBAL.GetMontosGiftCard();

            this.cmboMontos.ValueMember = "idMonto";
            this.cmboMontos.DisplayMember = "Saldo";
        }

        private void txtNombre_TextChanged(object sender, EventArgs e)
        {
            this._dt.DefaultView.RowFilter = string.Format("Nombre LIKE '%{0}%'", this.txtNombre.Text);
        }

        private void txtApellido_TextChanged(object sender, EventArgs e)
        {
            this._dt.DefaultView.RowFilter = string.Format("Apellido LIKE '%{0}%'", this.txtApellido.Text);
        }

        private void txtUsername_TextChanged(object sender, EventArgs e)
        {
            this._dt.DefaultView.RowFilter = string.Format("Usuario LIKE '%{0}%'", this.txtUsername.Text);
        }

        private void btnConfirmar_Click(object sender, EventArgs e)
        {
            try
            {
                int idMonto = (int)this.cmboMontos.SelectedValue;

                if (this._clienteOrigen.FloatSaldo >= ((MontoGiftCardEntity)this.cmboMontos.SelectedItem).Saldo)
                {
                    int idClienteDestino = Convert.ToInt32(this.dgwClientes.SelectedCells[0].Value);

                    this._giftBAL.ConfirmGiftCard(this._clienteOrigen.IntIdCliente, idClienteDestino, idMonto, this._fechaActual);
                    MessageBox.Show("La operacion ha sido realizada con exito", "Gift Card", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.Close();
                }
                else
                {
                    MessageBox.Show("El monto seleccionado supera el credito que posee", "Gift Card", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Se ha producido un error. " + ex.Message, "Gift Card", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
